﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;

namespace DADOS.esf
{
    public class metEsf
    {
        DB_PROAD banco = new DB_PROAD();

        private SqlConnection _conexao = new SqlConnection(ConfigurationManager.ConnectionStrings["DB_PROAD_SQL"].ConnectionString);

        private void FecharConexao(object banco)
        {
            ((DB_PROAD)banco).Connection.Close();
        }

        private void InicializarConexao(object banco)
        {
            ((DB_PROAD)banco).Connection.Open();
        }

        /// <summary>
        /// Incluir ES
        /// </summary>
        /// <param name="objEs">TB_ES objEs</param>
        public void Incluir(TB_ES objEs)
        {
            try
            {
                InicializarConexao(banco);
                banco.AddToTB_ES(objEs);
                banco.SaveChanges();
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
        }

        /// <summary>
        /// Lista de Equipes cadastradas de acordo com regras
        /// </summary>
        /// <param name="strNomeEs">string Nome Equipe</param>
        /// <param name="strArea">strint Área</param>
        /// <param name="strUs">string US</param>
        /// <param name="strCodUf">string CodUf</param>
        /// <returns>DataSet</returns>
        public DataSet ListarES(string strNomeEs, string strArea, string strUs, string strCodUf)
        {
            DataSet ds = new DataSet();

            string Query = "SELECT ES.CO_ES,";
            Query += "           ES.NO_ES,";
	        Query += "           ES.DS_AREA,";
	        Query += "           US.NO_US,";
            Query += "           ES.NR_STATUS,";
	        Query += "           UF.NO_SIGLA";
            Query += "     FROM TB_ES AS ES";
	        Query += "        INNER JOIN TB_US AS US";
		    Query += "            ON US.CO_US = ES.CO_US";
            Query += "        INNER JOIN TB_UF AS UF";
		    Query += "            ON UF.CO_UF = US.CO_UF";
            Query += " WHERE 1 = 1";

            if (!string.IsNullOrEmpty(strNomeEs))
            {
                Query += " AND ES.NO_ES LIKE '%" + strNomeEs + "%'";
            }

            if (!string.IsNullOrEmpty(strArea))
            {
                Query += " AND ES.DS_AREA LIKE '%" + strArea + "%'";
            }

            if (!string.IsNullOrEmpty(strUs))
            {
                Query += " AND US.NO_US LIKE '%" + strUs + "%'";
            }

            if (!string.IsNullOrEmpty(strCodUf) && strCodUf != "0")
            {
                Query += " AND UF.CO_UF = " + strCodUf;
            }

            Query += " ORDER BY ES.NO_ES";

            SqlCommand cmd = new SqlCommand(Query, _conexao);

            cmd.Connection = _conexao;

            if (_conexao.State == ConnectionState.Closed)
            {
                _conexao.Open();
            }
            SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
            dataAdapter.Fill(ds);

            _conexao.Close();

            return ds;
        }

        /// <summary>
        /// Lista as Equipe do Profissional
        /// </summary>
        /// <param name="intCodProfissional">Código do profissional</param>
        /// <returns>DataSet</returns>
        public DataSet ListarESProfissional(string intCodProfissional)
        {
            DataSet ds = new DataSet();

            string Query = "SELECT ES.CO_ES,";
            Query += "        ES.NO_ES,";
	        Query += "        ES.DS_AREA,";
	        Query += "        US.NO_US,";
            Query += "        ES.NR_STATUS,";
	        Query += "        UF.NO_SIGLA";
            Query += "        FROM TB_ES AS ES";
		    Query += "        INNER JOIN TB_US AS US";
		    Query += "            ON US.CO_US = ES.CO_US";
            Query += "        INNER JOIN TB_UF AS UF";
		    Query += "            ON UF.CO_UF = US.CO_UF";
		    Query += "        INNER JOIN TB_ALOCACAO_PROF AS ALOC";
			Query += "            ON ALOC.CO_ES = ES.CO_ES";
            Query += "        INNER JOIN TB_PROFISSIONAL AS PROF";
			Query += "            ON PROF.CO_PROFISSIONAL = ALOC.CO_PROFISSICIONAL";
            Query += " WHERE PROF.CO_PROFISSIONAL = " + intCodProfissional;
            Query += " ORDER BY ES.NO_ES";

            SqlCommand cmd = new SqlCommand(Query, _conexao);

            cmd.Connection = _conexao;

            if (_conexao.State == ConnectionState.Closed)
            {
                _conexao.Open();
            }
            SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
            dataAdapter.Fill(ds);

            _conexao.Close();

            return ds;
        }

        public DataSet ListarProfEquipe(string intCodEquipe)
        {
            DataSet ds = new DataSet();

            string Query = "SELECT PROF.NO_PROFISSIONAL,";
	        Query += "         PROF.DS_TELEFONE,";
	        Query += "                   CAT.NO_CATEGORIA,";
	        Query += "                   PROF.DS_EMAIL";
	        Query += "                FROM TB_PROFISSIONAL AS PROF";
	        Query += "                 INNER JOIN TB_ALOCACAO_PROF AS ALOC";
		    Query += "                    ON ALOC.CO_PROFISSICIONAL = PROF.CO_PROFISSIONAL";
	        Query += "                INNER JOIN TB_ES AS ES";
		    Query += "                    ON ES.CO_ES = ALOC.CO_ES";
	        Query += "                INNER JOIN TB_CATEGORIA_PROF AS CAT";
		    Query += "                    ON CAT.CO_CATEGORIA_PROF = PROF.CO_CATEGORIA_PROF";
            Query += "                WHERE ES.CO_ES = " + intCodEquipe;
	        Query += "                ORDER BY PROF.NO_PROFISSIONAL";

            SqlCommand cmd = new SqlCommand(Query, _conexao);

            cmd.Connection = _conexao;

            if (_conexao.State == ConnectionState.Closed)
            {
                _conexao.Open();
            }
            SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
            dataAdapter.Fill(ds);

            _conexao.Close();

            return ds;
        }

        /// <summary>
        /// Seleciona ES
        /// </summary>
        /// <param name="intCodEs">int CodEs</param>
        /// <returns>TB_ES objEs</returns>
        public TB_ES Selecionar(int intCodEs)
        {
            try
            {
                InicializarConexao(banco);
                var objEs = banco.TB_ES.Where(q => q.CO_ES == intCodEs).FirstOrDefault();
                return objEs;
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
        }

        /// <summary>
        /// Retona todas as equipes com o US passado
        /// </summary>
        /// <param name="intCodUS">Código US</param>
        /// <returns>Lista TB_ES</returns>
        public List<TB_ES> ListaEsUs(int intCodUS, int intCodProf)
        {
            try
            {
                InicializarConexao(banco);
                var listEs = banco.TB_ES.Where(q => q.CO_US == intCodUS).ToList();

                var listAloc = banco.TB_ALOCACAO_PROF.Where(q => q.CO_PROFISSICIONAL == intCodProf).ToList();

                if(listAloc !=null)
                {
                    foreach (var objLoc in listAloc)
                    {
                        listEs = listEs.Where(q => q.CO_ES != objLoc.CO_ES).ToList();
                    }
                }

                return listEs;
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
        }
        /// <summary>
        /// Listar Todas ES
        /// </summary>
        /// <param name="intCodUS"></param>
        /// <returns></returns>
        public List<TB_ES> ListaEsUsGeral(int intCodUS)
        {
            try
            {
                InicializarConexao(banco);
                var listEs = banco.TB_ES.Where(q => q.CO_US == intCodUS).ToList();

                return listEs;
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
        }

        /// <summary>
        /// Exluir alocação do profissional
        /// </summary>
        /// <param name="intCodProf">Código do Profissional</param>
        /// <param name="intCodEs">Código da ES</param>
        /// 
        public void ExcluirAlocacao(int intCodProf, int intCodEs)
        {
            try
            {
                InicializarConexao(banco);
                var objLoc = banco.TB_ALOCACAO_PROF.Where(q => q.CO_PROFISSICIONAL == intCodProf && q.CO_ES == intCodEs).FirstOrDefault();
                banco.DeleteObject(objLoc);
                banco.SaveChanges();
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
        }

        public DataSet ListarESRelatorio(string strUs, string strCodUf, int intAtencao)
        {
            DataSet ds = new DataSet();

            string Query = "SELECT ES.CO_ES,";
            Query += "           ES.NO_ES,";
            Query += "           ES.DS_AREA,";
            Query += "           US.NO_US,";
            Query += "           ES.NR_STATUS,";
            Query += "           UF.NO_SIGLA,";
            Query += "           ATENCAO.NO_ATENCAO_SUS";
            Query += "     FROM TB_ES AS ES";
            Query += "        INNER JOIN TB_US AS US";
            Query += "            ON US.CO_US = ES.CO_US";
            Query += "        INNER JOIN TB_UF AS UF";
            Query += "            ON UF.CO_UF = US.CO_UF";
            Query += "        INNER JOIN TB_ATENCAO_SUS AS ATENCAO";
            Query += "            ON ES.CO_ATENCAO_SUS = ATENCAO.CO_ATENCAO_SUS";
            Query += " WHERE 1 = 1";

          
            if (!string.IsNullOrEmpty(strUs))
            {
                Query += " AND US.NO_US LIKE '%" + strUs + "%'";
            }

            if (!string.IsNullOrEmpty(strCodUf) && strCodUf != "0")
            {
                Query += " AND UF.CO_UF = " + strCodUf;
            }

            if (intAtencao > 0)
            {
                Query += " AND ATENCAO.CO_ATENCAO_SUS = " + intAtencao;
            }

            Query += " ORDER BY ES.NO_ES";

            SqlCommand cmd = new SqlCommand(Query, _conexao);

            cmd.Connection = _conexao;

            if (_conexao.State == ConnectionState.Closed)
            {
                _conexao.Open();
            }
            SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
            dataAdapter.Fill(ds);

            _conexao.Close();

            return ds;
        }

        public void TrocarStatus(int intCodEs)
        {
            try
            {
                InicializarConexao(banco);
                var objEs = banco.TB_ES.Where(q => q.CO_ES == intCodEs).FirstOrDefault();
                if (objEs != null)
                {
                    if (objEs.NR_STATUS == 0)
                    {
                        objEs.NR_STATUS = 1;
                    }
                    else
                    {
                        objEs.NR_STATUS = 0;
                    }
                }
                banco.SaveChanges();
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
        }

        public void Alterar(TB_ES objEs)
        {
            try
            {
                InicializarConexao(banco);
                var objEsBanco = banco.TB_ES.Where(q => q.CO_ES == objEs.CO_ES).FirstOrDefault();
                
                objEsBanco.NO_ES = objEs.NO_ES;
                objEsBanco.DS_AREA = objEs.DS_AREA;
                objEsBanco.NR_STATUS = objEs.NR_STATUS;
                objEsBanco.CO_ATENCAO_SUS = objEs.CO_ATENCAO_SUS;
                objEsBanco.CO_US = objEs.CO_US;

                banco.SaveChanges();
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
        }

        public List<TB_US> ListaUsUf(int intCodUf)
        {
            try
            {
                InicializarConexao(banco);
                var listEs = banco.TB_US.Where(q => q.CO_UF == intCodUf).ToList();
                return listEs;
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
        }

        public List<TB_ES> ListarEquipes() 
        {

            try
            {
                InicializarConexao(banco);
                var listEs = banco.TB_ES.ToList();
                return listEs;
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }
        }

        public DataSet ListarEquipes(int intCodUf, int intCodMun)
        {
            DataSet ds = new DataSet();
            {
                string Query = "SELECT ES.CO_ES ";
                Query += " ,ES.NO_ES";
                Query += " ,ES.DS_AREA ";
                Query += " ,ES.NR_STATUS ";
                Query += " ,ES.CO_ATENCAO_SUS ";
                Query += " ,ES.CO_US ";
                Query += " ,ES.CO_PROFISSICIONAL ";
                if (intCodUf > 0)
                {
                    Query += " ,UF.NO_SIGLA ";
                }
                if (intCodMun > 0)
                {
                    Query += " ,CID.NO_CIDADE ";
                }
                Query += " FROM [DB_PROAD].[dbo].[TB_ES] AS ES ";
                Query += " INNER JOIN DB_PROAD..TB_US AS US ";
                Query += " ON ES.CO_US = US.CO_US ";
                if (intCodUf > 0)
                {
                    Query += " INNER JOIN DB_PROAD..TB_UF AS UF ";
                    Query += " ON UF.CO_UF = US.CO_UF ";
                    if (intCodMun > 0)
                    {
                        Query += " INNER JOIN DB_PROAD..TB_CIDADE AS CID ";
                        Query += " ON CID.CO_CIDADE = US.CO_MUNICIPIO ";
                    }
                }
                Query += " WHERE 1 = 1 ";
                if(intCodUf > 0){
                    Query += " AND US.CO_UF = " + intCodUf;
                    if (intCodMun > 0)
                    {
                        Query += " AND US.CO_MUNICIPIO = " + intCodMun;
                    }
                }
                
                SqlCommand cmd = new SqlCommand(Query, _conexao);

                cmd.Connection = _conexao;

                if (_conexao.State == ConnectionState.Closed)
                {
                    _conexao.Open();
                }
                SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd);
                dataAdapter.Fill(ds);

                _conexao.Close();

                return ds;
            }
        }

   
        /// <summary>
        /// Incluir Alocação do Profissional
        /// </summary>
        /// <param name="intCodProf">Código do profissional</param>
        /// <param name="intCodES">Código da ES</param>
        /// 
        /// 
        public void IncluirAlocacao(int intCodProf, int intCodES)
        {
            try
            {
                InicializarConexao(banco);
                var objAloc = new TB_ALOCACAO_PROF();
                objAloc.CO_ES = intCodES;
                objAloc.CO_PROFISSICIONAL = intCodProf;
                banco.AddToTB_ALOCACAO_PROF(objAloc);
                banco.SaveChanges();
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                FecharConexao(banco);
            }


        }
    }
}
